import axios from "axios";
import { ElMessage } from "element-plus";
import config from "@/config";
const service = axios.create({
    baseURL: config.baseApi,
});
const NETWORK_ERROR = "网络错误...";

// 添加请求拦截器
service.interceptors.request.use(
    function(config) {
        // 在发送请求之前做些什么，例如添加 token 等
        return config;
    },
    function(error) {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);


//添加响应拦截器
service.interceptors.response.use(
    (res) => {
    //解构赋值，从响应数据中提取code、data、msg
    const { code, data, msg } = res.data;
    //如果响应状态码为200，表示请求成功
    if(code === 200){
        //返回响应数据
        return data;
    }else{
        //定义一个常量表示网络错误信息
        const NETWORK_ERROR = "网络错误...";
        //使用Element Plus的Message组件显示错误信息
        ElMessage.error(msg || NETWORK_ERROR);
        //返回一个Promise.reject，这样错误信息可以被后续的.catch捕获
        return Promise.reject(msg || NETWORK_ERROR);
    }
  }
);


/**
 * 发送 HTTP 请求的函数
 * @param {Object} options - 请求的配置选项
 * @param {string} options.method - 请求方法，默认为 'get'
 * @param {Object} options.data - 请求的数据
 * @param {boolean} options.mock - 是否使用 mock 数据，默认为 config.mock 的值
 * @returns {Promise} - 返回一个 Promise，包含请求的响应数据
 */
function request(options){
    // 如果没有指定请求方法，则默认为 'get'
    options.method = options.method || "get";
    // 对于 GET 请求，将数据放在 params 中
    if(options.method.toLowerCase() === 'get'){
        options.params = options.data;
    }
    // 获取是否使用 mock 的配置
    let isMock = config.mock;
    // 如果在 options 中指定了 mock，则使用指定的值
    if(typeof options.mock!== "undefined"){
        isMock = options.mock;
    }
    // 根据环境变量设置基础 URL
    if(config.env){
        // 非 mock 环境，使用基础 API
        service.defaults.baseURL = config.baseApi;
    }else{
        // 根据 mock 配置选择 API
        service.defaults.baseURL = isMock? config.mockApi : config.baseApi;
    }
    // 发送请求并返回 Promise
    return service(options);
}

export default request;
